package main

import "fmt"

func main() {
	//ifTest(1)
	for2()

	// 会在函数最后执行，多个defer函数按声明顺序反向执行
	//defer fmt.Println("i am 2th")
	//defer deferTest()
	//forRange()
}
func deferTest() {
	fmt.Println("i am defer fun")
}

/**
Java去掉括号就行 运算符与Java一致
*/
func ifTest(x int) {
	if true {
		println("true")
	} else {
		println("false")
	}

	if x == 1 {
		println("1")
	} else if x == 2 {
		println("2")
	}
}

// go 的 switch是不需要带 break 的，执行完后会自动退出 switch
func switchTest(y int) {
	switch y {
	case 1:
		println(1)
		break
	case 2:
		println(2)
		break
	default:
		println("default")
	}

	/* 定义局部变量 */
	var grade = "B"
	var marks int = 90

	switch marks {
	case 90:
		grade = "A"
	case 80:
		grade = "B"
	case 50, 60, 70:
		grade = "C"
	default:
		grade = "D"
	}

	// switch后也可以不跟变量，直接在case处理 （菜鸟教程的例子）,case 中可以执行逻辑运算
	switch {
	case grade == "A":
		fmt.Printf("优秀!\n")
	case grade == "B", grade == "C":
		fmt.Printf("良好\n")
	case grade == "D" || grade == "C":
		fmt.Printf("及格\n")
	case grade == "F":
		fmt.Printf("不及格\n")
	default:
		fmt.Printf("差\n")
	}
	fmt.Printf("你的等级是 %s\n", grade)

	fmt.Println("-------type------")
	var x interface{}
	switch i := x.(type) {
	case nil:
		fmt.Printf(" x 的类型 :%T", i)
	case int:
		fmt.Printf("x 是 int 型")
	case float64:
		fmt.Printf("x 是 float64 型")
	case func(int) float64:
		fmt.Printf("x 是 func(int) 型")
	case bool, string:
		fmt.Printf("x 是 bool 或 string 型")
	default:
		fmt.Printf("未知型")

	}

	// fallthrough不管下一个case是否满足，都强制执行下一个case
	fmt.Println("--------fallthrough--------")
	var bbb = true
	switch {
	case bbb == true:
		fmt.Println("aaaaaaaa")
		fallthrough
	case bbb == false:
		fmt.Println("bbbbbbbbb")
		fallthrough
	case false:
		fmt.Println("cccccccc")
	case false:
		fmt.Println("dddddddddd")
		fallthrough
	case true:
		fmt.Println("eeeee")
	default:
		fmt.Println("default")

	}
}

/**
for
*/
func for2() {
	i := 0
	for i < 10 {
		fmt.Println(i)
		i++

	}
	fmt.Println("------")

	for i := 0; i < 5; i++ {
		fmt.Println(i)
	}
	fmt.Println("-------无限循环-------")

	// 无限循环 打印1-9和15
	num := 0
	for {
		num++
		if num < 10 {
			fmt.Println(num)
		} else if num >= 10 && num < 15 {
			continue
		} else {
			fmt.Println(num)
			break
		}
	}
	fmt.Println("--------goto 跳转到指定位置--------------")

	target := 0
HERE:
	for {
		if target < 5 {
			target++
			fmt.Println(target)
			goto HERE
		} else {
			break
		}
	}
}

//for range 可以对 slice、map、数组、字符串等进行迭代
func forRange() {
	numbers := []int{1, 2, 3}

	for i, n := range numbers {
		fmt.Println("index:", i)
		fmt.Println("current val:", n)
	}

}
